package com.lyy.system.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lyy.common.utils.*;
import com.lyy.common.utils.excel.ExcelUtils;
import com.lyy.common.utils.jxls.JxlsExport;
import com.lyy.system.pojo.SysVcode;
import com.lyy.system.service.SysVcodeService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * 发送消息记录最新一条(SysVcode)表控制层
 *
 * @author Yw
 * @since 2021-02-02 17:48:40
 */
@RestController
@RequestMapping("/sysVcode")
public class SysVcodeController {
    /**
     * 服务对象
     */
    @Resource
    private SysVcodeService sysVcodeService;

    /**
     * 创建发送消息记录最新一条
     * /sysVcode/createSysVcode
     * { "vcode":"动态密码",  "timeStamp1":"上一次时间戳",  "acount1":"每天记录数",  "timeStamp2":"每天开始一次的时间戳",  "acount2":"每小时记录数" }
     *
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @PostMapping("/createSysVcode")
    public Map<String, Object> createSysVcode(SysVcode sysVcode) {
        AssertUtils.notNull(sysVcode.getVcode(), "动态密码不能为空");
        AssertUtils.notNull(sysVcode.getTimeStamp1(), "上一次时间戳不能为空");
        AssertUtils.notNull(sysVcode.getAcount1(), "每天记录数不能为空");
        AssertUtils.notNull(sysVcode.getTimeStamp2(), "每天开始一次的时间戳不能为空");
        AssertUtils.notNull(sysVcode.getAcount2(), "每小时记录数不能为空");
        sysVcodeService.createSysVcode(sysVcode);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 根据主键修改发送消息记录最新一条
     * /sysVcode/updateSysVcode
     * { "username":"手机号码",  "vcode":"动态密码",  "timeStamp1":"上一次时间戳",  "acount1":"每天记录数",  "timeStamp2":"每天开始一次的时间戳",  "acount2":"每小时记录数" }
     *
     * @param username   手机号码
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @PutMapping("/updateSysVcode")
    public Map<String, Object> updateSysVcode(SysVcode sysVcode) {
        AssertUtils.notNull(sysVcode.getUsername(), "手机号码不能为空");
        AssertUtils.notNull(sysVcode.getVcode(), "动态密码不能为空");
        AssertUtils.notNull(sysVcode.getTimeStamp1(), "上一次时间戳不能为空");
        AssertUtils.notNull(sysVcode.getAcount1(), "每天记录数不能为空");
        AssertUtils.notNull(sysVcode.getTimeStamp2(), "每天开始一次的时间戳不能为空");
        AssertUtils.notNull(sysVcode.getAcount2(), "每小时记录数不能为空");
        sysVcodeService.updateSysVcode(sysVcode);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 根据主键获取单个发送消息记录最新一条
     * /sysVcode/getSysVcode
     * { "username":"手机号码" }
     *
     * @param username 手机号码
     * @return
     */
    @GetMapping("/getSysVcode")
    public Map<String, Object> getSysVcode(SysVcode sysVcode) {
        AssertUtils.notNull(sysVcode.getUsername(), "手机号码不能为空");
        SysVcode entity = sysVcodeService.getSysVcode(sysVcode);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sysVcode", entity);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 根据主键删除发送消息记录最新一条
     * /sysVcode/deleteSysVcode
     * { "username":"手机号码" }
     *
     * @param username 手机号码
     * @return
     */
    @DeleteMapping("/deleteSysVcode")
    public Map<String, Object> deleteSysVcode(SysVcode sysVcode) {
        AssertUtils.notNull(sysVcode.getUsername(), "手机号码不能为空");
        sysVcodeService.deleteSysVcode(sysVcode);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 查询发送消息记录最新一条列表
     * /sysVcode/selectSysVcodeList
     * { "username":"手机号码",  "vcode":"动态密码",  "timeStamp1":"上一次时间戳",  "acount1":"每天记录数",  "timeStamp2":"每天开始一次的时间戳",  "acount2":"每小时记录数" }
     *
     * @param username   手机号码
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @GetMapping("/selectSysVcodeList")
    public Map<String, Object> selectSysVcodeList(SysVcode sysVcode) {
        List<SysVcode> sysVcodes = sysVcodeService.selectSysVcodeList(sysVcode);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sysVcodes", sysVcodes);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }

    /**
     * 查询发送消息记录最新一条列表
     * /sysVcode/selectSysVcodeCount
     * { "username":"手机号码", "vcode":"动态密码", "timeStamp1":"上一次时间戳", "acount1":"每天记录数", "timeStamp2":"每天开始一次的时间戳", "acount2":"每小时记录数"}
     *
     * @param username   手机号码
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @GetMapping("/selectSysVcodeCount")
    public Map<String, Object> selectSysVcodeCount(SysVcode sysVcode) {
        int count = sysVcodeService.selectSysVcodeCount(sysVcode);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("count", count);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 查询发送消息记录最新一条列表分页
     * /sysVcode/selectSysVcodePage
     * { "username":"手机号码",  "vcode":"动态密码",  "timeStamp1":"上一次时间戳",  "acount1":"每天记录数",  "timeStamp2":"每天开始一次的时间戳",  "acount2":"每小时记录数" ,"pageNum":"页码","pageSize":"条数"}
     *
     * @param pageNum    页码
     * @param pageSize   页数
     * @param username   手机号码
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @GetMapping("/selectSysVcodePage")
    public Map<String, Object> selectSysVcodePage(SysVcode sysVcode, Integer pageNum, Integer pageSize) {
        AssertUtils.notNull(pageNum, "页码不能为空!");
        AssertUtils.notNull(pageSize, "条数不能为空!");
        PageHelper.startPage(pageNum, pageSize);
        List<SysVcode> sysVcodes = sysVcodeService.selectSysVcodeList(sysVcode);
        PageInfo<SysVcode> pageInfo = new PageInfo<>(sysVcodes);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pageInfo", pageInfo);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 导出发送消息记录最新一条
     * /sysVcode/exportSysVcodeExcel
     * { "username":"手机号码",  "vcode":"动态密码",  "timeStamp1":"上一次时间戳",  "acount1":"每天记录数",  "timeStamp2":"每天开始一次的时间戳",  "acount2":"每小时记录数" }
     *
     * @param username   手机号码
     * @param vcode      动态密码
     * @param timeStamp1 上一次时间戳
     * @param acount1    每天记录数
     * @param timeStamp2 每天开始一次的时间戳
     * @param acount2    每小时记录数
     * @return
     */
    @GetMapping("/exportSysVcodeExcel")
    public void exportSysVcodeExcel(HttpServletRequest request, HttpServletResponse response, SysVcode sysVcode) {
        List<SysVcode> sysVcodes = sysVcodeService.selectSysVcodeList(sysVcode);
        if (CommonUtils.isNotEmpty(sysVcodes)) {
            List<String> titles = new ArrayList<>();
            titles.add(" 序号 ");
            titles.add(" 动态密码 ");
            titles.add(" 上一次时间戳 ");
            titles.add(" 每天记录数 ");
            titles.add(" 每天开始一次的时间戳 ");
            titles.add(" 每小时记录数 ");
            List<List<String>> values = new ArrayList<>();
            int k = 0;
            for (SysVcode entity : sysVcodes) {
                List<String> value = new ArrayList<>();
                value.add((++k) + "");
                value.add(entity.getVcode());
                value.add(entity.getTimeStamp1());
                value.add(entity.getAcount1() + "");
                value.add(entity.getTimeStamp2());
                value.add(entity.getAcount2() + "");
                values.add(value);
            }
            String address = Constants.address + "/wisdom/template/customTemplate.xls";
            String excelName = "发送消息记录最新一条.xls";
            Map<String, Object> beans = new HashMap<>();
            beans.put("titles", titles);
            beans.put("values", values);
            beans.put("date", DateUtils.formatDateTime(new Date()));
            JxlsExport.export(request, response, beans, excelName, address);
        }
    }


    /**
     * /sysVcode/importSysVcodeExcel  从excel表导入发送消息记录最新一条
     * 导入excel文件
     * {"file":"excel文件"}
     *
     * @param file excel文件
     */
    @PostMapping("/importSysVcodeExcel")
    public Map<String, Object> importSysVcodeExcel(MultipartFile file) {
        if (file.isEmpty()) {
            return ResultUtils.getResult(ResultInfo.UPLOAD_NOT_EXISTS);
        }
        // 文件名称
        String fileName = file.getOriginalFilename();
        if (StringUtils.isBlank(fileName)) {
            return ResultUtils.getResult(ResultInfo.UPLOAD_NOT_EXISTS);
        }
        try {
            InputStream inputStream = file.getInputStream();
            //创建工作簿
            Workbook wb = null;
            //判断表格格式
            if (fileName.toLowerCase().endsWith("xls")) {
                wb = new HSSFWorkbook(inputStream);
            } else if (fileName.toLowerCase().endsWith("xlsx")) {
                wb = new XSSFWorkbook(inputStream);
            } else {
                return ResultUtils.getResult(ResultInfo.UPLOAD_TYPE_ERROR);
            }
            List<SysVcode> sysVcodes = new ArrayList<>();
            List<Map<String, String>> resultMap = new ArrayList<>();
            Map<String, String> result = null;
            SysVcode sysVcode = null;
            // 获取工作表的第一个Sheet
            Sheet hssfSheet = wb.getSheetAt(0);
            if (hssfSheet != null) {
                int index = -1;
                for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    Row hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        if (ExcelUtils.getValue(hssfRow.getCell(0)).contains("动态密码") &&
                                ExcelUtils.getValue(hssfRow.getCell(1)).contains("上一次时间戳") &&
                                ExcelUtils.getValue(hssfRow.getCell(2)).contains("每天记录数") &&
                                ExcelUtils.getValue(hssfRow.getCell(3)).contains("每天开始一次的时间戳") &&
                                ExcelUtils.getValue(hssfRow.getCell(4)).contains("每小时记录数")) {
                            index = ++rowNum;
                            break;
                        }
                    }
                }

                if (index == -1) {
                    result = new HashMap<>();
                    result.put("reason", "excel模板不正确");
                    result.put("status", "1");
                    resultMap.add(result);
                    Map<String, Object> map = new HashMap<>();
                    map.put("resultMap", resultMap);
                    return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
                }

                // 循环行Row
                for (int rowNum = index; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    Row hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        if (StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(0))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(1))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(2))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(3))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(4)))) {
                            continue;
                        }
                        sysVcode = new SysVcode();
                        String vcode = ExcelUtils.getValue(hssfRow.getCell(0));//动态密码
                        if (StringUtils.isBlank(vcode)) {
                            result = new HashMap<>();
                            result.put("reason", "动态密码不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        sysVcode.setVcode(vcode);
                        String timeStamp1 = ExcelUtils.getValue(hssfRow.getCell(1));//上一次时间戳
                        if (StringUtils.isBlank(timeStamp1)) {
                            result = new HashMap<>();
                            result.put("reason", "上一次时间戳不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        sysVcode.setTimeStamp1(timeStamp1);
                        String acount1 = ExcelUtils.getValue(hssfRow.getCell(2));//每天记录数
                        if (StringUtils.isBlank(acount1)) {
                            result = new HashMap<>();
                            result.put("reason", "每天记录数不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        sysVcode.setAcount1(Integer.valueOf(acount1));
                        String timeStamp2 = ExcelUtils.getValue(hssfRow.getCell(3));//每天开始一次的时间戳
                        if (StringUtils.isBlank(timeStamp2)) {
                            result = new HashMap<>();
                            result.put("reason", "每天开始一次的时间戳不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        sysVcode.setTimeStamp2(timeStamp2);
                        String acount2 = ExcelUtils.getValue(hssfRow.getCell(4));//每小时记录数
                        if (StringUtils.isBlank(acount2)) {
                            result = new HashMap<>();
                            result.put("reason", "每小时记录数不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        sysVcode.setAcount2(Integer.valueOf(acount2));
                        sysVcodes.add(sysVcode);
                    }
                }
                if (CommonUtils.isNotEmpty(sysVcodes)) {
                    resultMap.addAll(sysVcodeService.importSysVcodeExcel(sysVcodes));
                }
            }
            inputStream.close();
            Map<String, Object> map = new HashMap<>();
            map.put("resultMap", resultMap);
            return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtils.getResult(ResultInfo.ERROR);
        }
        return ResultUtils.getResult(ResultInfo.FAILED);
    }
}